const express=require('express')
const app=express()

//导入用于生成jwt字符串的包
const jwt=require('jsonwebtoken')
//导入用于讲客户端发来的JWT字符串解析还原成JSON对象的包
const expressJWT=require('express-jwt')

//允许资源跨域共享
const cors=require('cors')
app.use(cors())

//解析post表单数据的中间件
const bodyParser=require('body-parser')
app.use(bodyParser.urlencoded({extended:false}))

//定义secret密钥,简易命名为scretKey
const secretKey='Interstellar crossing'

//注册将jwt字符串解析还原成JSON对象的中间件
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))

//调用jsonwebtoken提供的sign()方法将用户的信息加密成JWT字符串,相应给客户端
app.post('/api/login',(req,res)=>{
  const userinfo=req.body
  if(userinfo.username!=='admin'||userinfo.password!=='000000'){
    return res.send({
      status:400,
      message:'登陆失败'
    })
  }
  //参数1:用户的信息对象 参数2:加密的密钥 参数3:配置对象,可以配置当前token的有效期
  const tokenStr=jwt.sign({username:userinfo.username},secretKey,{expiresIn:'30s'})
  res.send({
    status:200,
    message:'登陆成功',
    token:tokenStr
  })
})

app.get('/admin/getinfo',(req,res)=>{
  console.log(req.user);
  res.send({
    status:200,
    message:'获取用户信息成功',
    data:req.user
  })
})

//捕获解析JWT失败后产生的错误
app.use((err,req,res,next)=>{
  //错误有token解析失败造成的
  if(err.name==='UnauthorizedError'){
    return res.send({
      status:401,
      message:'无效的token'
    })
  }
  res.send({
    status:500,
    message:'未知错误'
  })
})

app.listen(8888,()=>{
  console.log('http://127.0.0.1:8888');
})